home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / sound / scope_xt4 / src / deli_fft.i next >
Text File  |  1999-05-14  |  38KB  |  1,776 lines

  1.  
  2.  
  3. ; this ultra fast FFT routine was taken from:
  4. ;-------------------------------------------------------
  5. ;  DeliTracker FFTAnalyzer genie module V1.6 (19 Apr 95)
  6. ;
  7. ;   © 1994-95 by Delirium Softdesign
  8. ;   (Peter Kunath and Frank Riffel)
  9. ;       All rights reserved.
  10. ;   Special thanks to Kim Øyhus for
  11. ;  the fastest FFT routine ever done
  12. ;           on the Amiga.
  13. ;-------------------------------------------------------
  14. ;
  15. ; adapted+optimized by Smack/Infect!
  16. ; Fri 30-Apr-99
  17. ;
  18.  
  19.  
  20.  
  21. ;-------------------------------------------------------------------------
  22. ;
  23. ; !! uses FPU (requires emulation on 68040/060) !!
  24. ;
  25. ; precalculates log_table used by 'deli_fft'
  26. ;
  27. fft_init
  28.     lea    (fft_log_table),a0
  29.     move    #255,d2
  30.     moveq    #-1,d7
  31.     fmove.w    #0,fp1
  32.     fmove.w    #2,fp2
  33.     fmove.s    #5.5,fp3
  34.     fmove.w    #7500,fp4
  35.     fmove.w    #0,fp5
  36.     fmove.w    #1,fp6
  37. .loop
  38.     fmove    fp1,fp0
  39.     fadd    fp2,fp0
  40.     flog2    fp0        ;!! n/a 68040/060 !!
  41.     fsub    fp3,fp0
  42.     fbge    .ge
  43.     fmove    fp5,fp0
  44. .ge    fmul    fp4,fp0
  45.  
  46.     fmove.l    fp0,d0
  47.     lsr.l    #8,d0
  48.     cmp    d2,d0
  49.     ble.b    .le
  50.     move    d2,d0
  51. .le    move.b    d0,(a0)+
  52.  
  53.     fadd    fp6,fp1
  54.     dbf    d7,.loop
  55.     rts
  56.  
  57.  
  58.  
  59.  
  60. ;-------------------------------------------------------------------------
  61. ;
  62. ; !! requires FPU (68881/2, 68040 or 68060) !!
  63. ;
  64. ; input:
  65. ; a0 - pointer to data array
  66. ;      (504 8-bit-samples as signed words)
  67. ; d0 - NULL / NOT_NULL - linear / logarithmic intensity scale
  68. ;
  69. ; log_table - must be precalculated (call 'fft_init' at program start)
  70. ;
  71. ; output:
  72. ; the first 252 elements of the data array contain the spectrum
  73. ; as unsigned words
  74. ;
  75. deli_fft
  76.     move.l    d0,-(a7)
  77.     pea    (a0)
  78.     lea    (scrambled_1008w),a1
  79.     bsr    scramble_data
  80.  
  81.     bsr    pass1_6
  82.     bsr    pass2_6
  83.     bsr    pass3_6
  84.  
  85.     move    #792-1,d4
  86.     lea    (buffer_792w),a0
  87.     lea    (scrambled_sincos,pc),a2
  88.     moveq    #14,d7
  89. .loop    move    (a0),d0
  90.     muls    (a2)+,d0
  91.     lsr.l    d7,d0        ;#14
  92.     move    d0,(a0)+
  93.     dbf    d4,.loop
  94.  
  95.     bsr    pass4_6
  96.     bsr    pass5_6
  97.     bsr    pass6_6
  98.  
  99.     move.l    (a7),a0
  100.     lea    (scrambled_1008w),a1
  101.     bsr    unscramble_data
  102.  
  103.     move.l    (a7)+,a0
  104.     lea    (1008,a0),a1
  105.     lea    (fft_log_table),a2
  106.     move    #252-1,d7
  107.     move.l    (a7)+,d6
  108.  
  109.     fmove.w    #25,fp5
  110. .band_loop
  111.     move    (a0),d1
  112.     move    -(a1),d0
  113.     muls    d1,d1
  114.     muls    d0,d0
  115.     add.l    d1,d0
  116.  
  117.     fmove.l    d0,fp0
  118.     fsqrt    fp0
  119.     tst.l    d6
  120.     bne.b    .log
  121.  
  122.     fmul    fp5,fp0
  123.     fmove.l    fp0,d0
  124.     swap    d0
  125.     tst    d0
  126.     beq.b    .eq
  127.     moveq    #-1,d0
  128. .eq    swap    d0
  129.     move    d0,(a0)+
  130.     dbf    d7,.band_loop
  131.     bra.b    .end
  132.     
  133. .log    fmove.l    fp0,d0
  134.     move.b    (a2,d0.l),d0
  135.     lsl    #8,d0
  136.     move    d0,(a0)+
  137.     dbf    d7,.band_loop
  138. .end    rts
  139.  
  140.  
  141.  
  142.  
  143. scramble_data
  144.     move    (a0)+,(a1)
  145.     move    (a0)+,(164,a1)
  146.     move    (a0)+,($148,a1)
  147.     move    (a0)+,($1ec,a1)
  148.     move    (a0)+,($290,a1)
  149.     move    (a0)+,($334,a1)
  150.     move    (a0)+,($3d8,a1)
  151.     move    (a0)+,($8c,a1)
  152.     move    (a0)+,($a0,a1)
  153.     move    (a0)+,($132,a1)
  154.     move    (a0)+,($1d6,a1)
  155.     move    (a0)+,($27a,a1)
  156.     move    (a0)+,($31e,a1)
  157.     move    (a0)+,($3c2,a1)
  158.     move    (a0)+,($76,a1)
  159.     move    (a0)+,($11a,a1)
  160.     move    (a0)+,($12e,a1)
  161.     move    (a0)+,($1d2,a1)
  162.     move    (a0)+,($264,a1)
  163.     move    (a0)+,($308,a1)
  164.     move    (a0)+,($3ac,a1)
  165.     move    (a0)+,($60,a1)
  166.     move    (a0)+,($104,a1)
  167.     move    (a0)+,($1a8,a1)
  168.     move    (a0)+,($1bc,a1)
  169.     move    (a0)+,($260,a1)
  170.     move    (a0)+,($304,a1)
  171.     move    (a0)+,($396,a1)
  172.     move    (a0)+,($4a,a1)
  173.     move    (a0)+,($ee,a1)
  174.     move    (a0)+,($192,a1)
  175.     move    (a0)+,($236,a1)
  176.     move    (a0)+,($24a,a1)
  177.     move    (a0)+,($2ee,a1)
  178.     move    (a0)+,($392,a1)
  179.     move    (a0)+,($46,a1)
  180.     move    (a0)+,($d8,a1)
  181.     move    (a0)+,($17c,a1)
  182.     move    (a0)+,($220,a1)
  183.     move    (a0)+,($2c4,a1)
  184.     move    (a0)+,($2d8,a1)
  185.     move    (a0)+,($37c,a1)
  186.     move    (a0)+,($30,a1)
  187.     move    (a0)+,($d4,a1)
  188.     move    (a0)+,($178,a1)
  189.     move    (a0)+,($20a,a1)
  190.     move    (a0)+,($2ae,a1)
  191.     move    (a0)+,($352,a1)
  192.     move    (a0)+,($366,a1)
  193.     move    (a0)+,($1a,a1)
  194.     move    (a0)+,($be,a1)
  195.     move    (a0)+,($162,a1)
  196.     move    (a0)+,($206,a1)
  197.     move    (a0)+,($2aa,a1)
  198.     move    (a0)+,($33c,a1)
  199.     move    (a0)+,($3e0,a1)
  200.     move    (a0)+,(4,a1)
  201.     move    (a0)+,($a8,a1)
  202.     move    (a0)+,($14c,a1)
  203.     move    (a0)+,($1f0,a1)
  204.     move    (a0)+,($294,a1)
  205.     move    (a0)+,($338,a1)
  206.     move    (a0)+,($3dc,a1)
  207.     move    (a0)+,($7e,a1)
  208.     move    (a0)+,($92,a1)
  209.     move    (a0)+,($136,a1)
  210.     move    (a0)+,($1da,a1)
  211.     move    (a0)+,($27e,a1)
  212.     move    (a0)+,($322,a1)
  213.     move    (a0)+,($3c6,a1)
  214.     move    (a0)+,($7a,a1)
  215.     move    (a0)+,($11e,a1)
  216.     move    (a0)+,($120,a1)
  217.     move    (a0)+,($1c4,a1)
  218.     move    (a0)+,($268,a1)
  219.     move    (a0)+,($30c,a1)
  220.     move    (a0)+,($3b0,a1)
  221.     move    (a0)+,($64,a1)
  222.     move    (a0)+,($108,a1)
  223.     move    (a0)+,($1ac,a1)
  224.     move    (a0)+,($1c0,a1)
  225.     move    (a0)+,($252,a1)
  226.     move    (a0)+,($2f6,a1)
  227.     move    (a0)+,($39a,a1)
  228.     move    (a0)+,($4e,a1)
  229.     move    (a0)+,($f2,a1)
  230.     move    (a0)+,($196,a1)
  231.     move    (a0)+,($23a,a1)
  232.     move    (a0)+,($24e,a1)
  233.     move    (a0)+,($2f2,a1)
  234.     move    (a0)+,($384,a1)
  235.     move    (a0)+,($38,a1)
  236.     move    (a0)+,($dc,a1)
  237.     move    (a0)+,($180,a1)
  238.     move    (a0)+,($224,a1)
  239.     move    (a0)+,($2c8,a1)
  240.     move    (a0)+,($2dc,a1)
  241.     move    (a0)+,($380,a1)
  242.     move    (a0)+,($34,a1)
  243.     move    (a0)+,($c6,a1)
  244.     move    (a0)+,($16a,a1)
  245.     move    (a0)+,($20e,a1)
  246.     move    (a0)+,($2b2,a1)
  247.     move    (a0)+,($356,a1)
  248.     move    (a0)+,($36a,a1)
  249.     move    (a0)+,($1e,a1)
  250.     move    (a0)+,($c2,a1)
  251.     move    (a0)+,($166,a1)
  252.     move    (a0)+,($1f8,a1)
  253.     move    (a0)+,($29c,a1)
  254.     move    (a0)+,($340,a1)
  255.     move    (a0)+,($3e4,a1)
  256.     move    (a0)+,(8,a1)
  257.     move    (a0)+,($ac,a1)
  258.     move    (a0)+,($150,a1)
  259.     move    (a0)+,($1f4,a1)
  260.     move    (a0)+,($298,a1)
  261.     move    (a0)+,($32a,a1)
  262.     move    (a0)+,($3ce,a1)
  263.     move    (a0)+,($82,a1)
  264.     move    (a0)+,($96,a1)
  265.     move    (a0)+,($13a,a1)
  266.     move    (a0)+,($1de,a1)
  267.     move    (a0)+,($282,a1)
  268.     move    (a0)+,($326,a1)
  269.     move    (a0)+,($3ca,a1)
  270.     move    (a0)+,($6c,a1)
  271.     move    (a0)+,($110,a1)
  272.     move    (a0)+,($124,a1)
  273.     move    (a0)+,($1c8,a1)
  274.     move    (a0)+,($26c,a1)
  275.     move    (a0)+,($310,a1)
  276.     move    (a0)+,($3b4,a1)
  277.     move    (a0)+,($68,a1)
  278.     move    (a0)+,($10c,a1)
  279.     move    (a0)+,($19e,a1)
  280.     move    (a0)+,($1b2,a1)
  281.     move    (a0)+,($256,a1)
  282.     move    (a0)+,($2fa,a1)
  283.     move    (a0)+,($39e,a1)
  284.     move    (a0)+,($52,a1)
  285.     move    (a0)+,($f6,a1)
  286.     move    (a0)+,($19a,a1)
  287.     move    (a0)+,($23e,a1)
  288.     move    (a0)+,($240,a1)
  289.     move    (a0)+,($2e4,a1)
  290.     move    (a0)+,($388,a1)
  291.     move    (a0)+,($3c,a1)
  292.     move    (a0)+,($e0,a1)
  293.     move    (a0)+,($184,a1)
  294.     move    (a0)+,($228,a1)
  295.     move    (a0)+,($2cc,a1)
  296.     move    (a0)+,($2e0,a1)
  297.     move    (a0)+,($372,a1)
  298.     move    (a0)+,($26,a1)
  299.     move    (a0)+,($ca,a1)
  300.     move    (a0)+,($16e,a1)
  301.     move    (a0)+,($212,a1)
  302.     move    (a0)+,($2b6,a1)
  303.     move    (a0)+,($35a,a1)
  304.     move    (a0)+,($36e,a1)
  305.     move    (a0)+,($22,a1)
  306.     move    (a0)+,($b4,a1)
  307.     move    (a0)+,($158,a1)
  308.     move    (a0)+,($1fc,a1)
  309.     move    (a0)+,($2a0,a1)
  310.     move    (a0)+,($344,a1)
  311.     move    (a0)+,($3e8,a1)
  312.     move    (a0)+,(12,a1)
  313.     move    (a0)+,($b0,a1)
  314.     move    (a0)+,($154,a1)
  315.     move    (a0)+,($1e6,a1)
  316.     move    (a0)+,($28a,a1)
  317.     move    (a0)+,($32e,a1)
  318.     move    (a0)+,($3d2,a1)
  319.     move    (a0)+,($86,a1)
  320.     move    (a0)+,($9a,a1)
  321.     move    (a0)+,($13e,a1)
  322.     move    (a0)+,($1e2,a1)
  323.     move    (a0)+,($286,a1)
  324.     move    (a0)+,($318,a1)
  325.     move    (a0)+,($3bc,a1)
  326.     move    (a0)+,($70,a1)
  327.     move    (a0)+,($114,a1)
  328.     move    (a0)+,($128,a1)
  329.     move    (a0)+,($1cc,a1)
  330.     move    (a0)+,($270,a1)
  331.     move    (a0)+,($314,a1)
  332.     move    (a0)+,($3b8,a1)
  333.     move    (a0)+,($5a,a1)
  334.     move    (a0)+,($fe,a1)
  335.     move    (a0)+,($1a2,a1)
  336.     move    (a0)+,($1b6,a1)
  337.     move    (a0)+,($25a,a1)
  338.     move    (a0)+,($2fe,a1)
  339.     move    (a0)+,($3a2,a1)
  340.     move    (a0)+,($56,a1)
  341.     move    (a0)+,($fa,a1)
  342.     move    (a0)+,($18c,a1)
  343.     move    (a0)+,($230,a1)
  344.     move    (a0)+,($244,a1)
  345.     move    (a0)+,($2e8,a1)
  346.     move    (a0)+,($38c,a1)
  347.     move    (a0)+,($40,a1)
  348.     move    (a0)+,($e4,a1)
  349.     move    (a0)+,($188,a1)
  350.     move    (a0)+,($22c,a1)
  351.     move    (a0)+,($2be,a1)
  352.     move    (a0)+,($2d2,a1)
  353.     move    (a0)+,($376,a1)
  354.     move    (a0)+,($2a,a1)
  355.     move    (a0)+,($ce,a1)
  356.     move    (a0)+,($172,a1)
  357.     move    (a0)+,($216,a1)
  358.     move    (a0)+,($2ba,a1)
  359.     move    (a0)+,($35e,a1)
  360.     move    (a0)+,($360,a1)
  361.     move    (a0)+,($14,a1)
  362.     move    (a0)+,($b8,a1)
  363.     move    (a0)+,($15c,a1)
  364.     move    (a0)+,($200,a1)
  365.     move    (a0)+,($2a4,a1)
  366.     move    (a0)+,($348,a1)
  367.     move    (a0)+,($3ec,a1)
  368.     move    (a0)+,($10,a1)
  369.     move    (a0)+,($a2,a1)
  370.     move    (a0)+,($146,a1)
  371.     move    (a0)+,($1ea,a1)
  372.     move    (a0)+,($28e,a1)
  373.     move    (a0)+,($332,a1)
  374.     move    (a0)+,($3d6,a1)
  375.     move    (a0)+,($8a,a1)
  376.     move    (a0)+,($9e,a1)
  377.     move    (a0)+,($142,a1)
  378.     move    (a0)+,($1d4,a1)
  379.     move    (a0)+,($278,a1)
  380.     move    (a0)+,($31c,a1)
  381.     move    (a0)+,($3c0,a1)
  382.     move    (a0)+,($74,a1)
  383.     move    (a0)+,($118,a1)
  384.     move    (a0)+,($12c,a1)
  385.     move    (a0)+,($1d0,a1)
  386.     move    (a0)+,($274,a1)
  387.     move    (a0)+,($306,a1)
  388.     move    (a0)+,($3aa,a1)
  389.     move    (a0)+,($5e,a1)
  390.     move    (a0)+,($102,a1)
  391.     move    (a0)+,($1a6,a1)
  392.     move    (a0)+,($1ba,a1)
  393.     move    (a0)+,($25e,a1)
  394.     move    (a0)+,($302,a1)
  395.     move    (a0)+,($3a6,a1)
  396.     move    (a0)+,($48,a1)
  397.     move    (a0)+,($ec,a1)
  398.     move    (a0)+,($190,a1)
  399.     move    (a0)+,($234,a1)
  400.     move    (a0)+,($248,a1)
  401.     move    (a0)+,($2ec,a1)
  402.     move    (a0)+,($390,a1)
  403.     move    (a0)+,($44,a1)
  404.     move    (a0)+,($e8,a1)
  405.     move    (a0)+,($17a,a1)
  406.     move    (a0)+,($21e,a1)
  407.     move    (a0)+,($2c2,a1)
  408.     move    (a0)+,($2d6,a1)
  409.     move    (a0)+,($37a,a1)
  410.     move    (a0)+,($2e,a1)
  411.     move    (a0)+,($